﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using InnvoiceActual.Logica.GestorObject.Remito;
using InnvoiceActual.Logica.GestorObject;
using InnvoiceActual.Logica.GestorDB;
using InnvoiceActual.Logica.GestorObject.Articulo;
using InnvoiceActual.Logica.GestorDB.RemitoDB;
using InnvoiceActual.Ws.Articulos.SubArticulos;
using InnvoiceActual.Ws.Articulos.Articulos;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Globalization;
using InnvoiceActual.Ws.Articulos.Categorias;

namespace InnvoiceActual.Ws.Remitos
{
    /// <summary>
    /// Lógica de interacción para VerModificaRemito.xaml
    /// </summary>
    public partial class VerModificarRemito : Window
    {
        #region Property

        //Variables
        bool nuevoItem = false;

        private Remito _remito = new Remito();
        private ItemRemito itemSeleccionado = new ItemRemito();
        private int indexItemSeleccionado = -1;
        private EmpresaCS empresa = EmpresaCS.Instance;

        private List<ItemRemito> itemsEliminados = new List<ItemRemito>();

        //Bases de Datos
        private CondicionDePagoDB condicionDePagoDB = new CondicionDePagoDB();
        private ArticuloDB articuloDB = new ArticuloDB();
        private ClienteDB clienteDB = new ClienteDB();
        
        private RemitoDB remitoDB = new RemitoDB();
        private CabeceraRemitoDB cabeceraDB = new CabeceraRemitoDB();
        private ItemRemitoDB itemsDB = new ItemRemitoDB();
        private PieRemitoDB pieDB = new PieRemitoDB();

        

        #endregion

        #region Contructor

        public VerModificarRemito()
        {
            itemsEliminados.Clear();
            InitializeComponent();
        }

        public VerModificarRemito(Remito remito)
        {

            _remito = remito;
            DataContext = _remito;
            _remito.Cliente.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(remitoCliente_PropertyChanged);
            _remito.Pie.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(remitoPie_PropertyChanged);
            itemsEliminados.Clear();
            InitializeComponent();
        }

        #endregion

        #region Windows Methods

        #region Metodos de Eventos

        private void Windows_Loaded(object sender, RoutedEventArgs e)
        {
            CargarRemito();
        }

        private void remitoCliente_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            btnAceptar.IsEnabled = ValidarRemito();
        }

        void remitoPie_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            btnAceptar.IsEnabled = ValidarRemito();
        }

        #endregion

        #region Botones

        private void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            GuardarElemento();
        }

        #endregion

        #region Metodos de Teclas

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F1":
                    GuardarElemento();
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }

        private void dgArticulosRemitos_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F3":
                    EliminarItem();
                    break;
                case "F4":
                    cantValue.IsEnabled = true;
                    nuevoItem = true;
                    break;
                default:
                    break;
            }
        }

        #region Cabecera

        private void CodigoClienteValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    LlenarEncabezadoSegunCodigoCliente();
                    break;
                case "RETURN":
                    LlenarEncabezadoSegunCodigoCliente();
                    break;
                default:
                    break;
            }
        }

        private void razonSocialClienteTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    LlenarEncabezadoSegunRazonSocialCliente();
                    break;
                case "RETURN":
                    LlenarEncabezadoSegunRazonSocialCliente();
                    break;
                default:
                    break;
            }
        }

        #endregion

        #region Items

        private void cantValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    codigoCategoriaValue.IsEnabled = true;
                    codigoCategoriaValue.Text = "";

                    codigoArticuloValue.IsEnabled = true;
                    codigoArticuloValue.Text = "";

                    codigoSubArticuloValue.IsEnabled = true;
                    codigoSubArticuloValue.Text = "";
                    break;
                default:
                    break;
            }
        }

        private void codigoCategoriaValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    
                    codigoArticuloValue.IsEnabled = true;
                    codigoArticuloValue.Text = "";

                    codigoSubArticuloValue.IsEnabled = true;
                    codigoSubArticuloValue.Text = "";
                    break;
                case "F5":
                    Ventana_Categorias();

                    codigoArticuloValue.IsEnabled = true;
                    codigoArticuloValue.Text = "";

                    codigoSubArticuloValue.IsEnabled = true;
                    codigoSubArticuloValue.Text = "";
                    break;
                default:
                    break;
            }
        }

        private void codigoArticuloValue_KeyDown(object sender, KeyEventArgs e)
        {

            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    codigoSubArticuloValue.Text = "";
                    break;
                case "F5":
                    if (!codigoCategoriaValue.Text.Equals(null))
                    {
                        Ventana_Articulos();
                    }
                    else
                    {
                        MessageBox.Show("Debe Ingresar un codigo de categoria, para buscar los articulos de la misma", "Buscar Articulo", MessageBoxButton.OK, MessageBoxImage.Question);
                        Limpiar_y_DesactivarCampos();
                    }
                    break;
                default:
                    return;
            }
        }

        private void codigoSubArticuloValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    int codigoEmpresa = empresa.CodigoEmpresa;

                    int codigo = Convert.ToInt16(codigoSubArticuloValue.Text);
                    int codigoArticulo = Convert.ToInt16(codigoArticuloValue.Text);
                    int codigoCategoria = Convert.ToInt16(codigoCategoriaValue.Text);
                    SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(codigo, codigoArticulo, codigoCategoria);

                    if (!subArticulo.Codigo.Equals(-1))
                    {
                        descripcionValue.Text = subArticulo.CategoriaDescripcion + " - " + subArticulo.ArticuloDescripcion + " - " + subArticulo.Descripcion;
                        precioUnitarioValue.Text = subArticulo.PrecioNeto.ToString();
                        ivaValue.Text = subArticulo.Codigo_Alicuota_Tasa.ToString();
                        descripcionValue.IsEnabled = true;
                        precioUnitarioValue.IsEnabled = true;
                        ivaValue.IsEnabled = true;
                        precioTotalValue.IsEnabled = true;
                        LlenarCampoPrecioTotal();
                    }
                    else
                    {
                        MessageBox.Show("Seleccione un codigo correcto de Articulo, el siguiente no es valido: " + codigo, "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
                        Limpiar_y_DesactivarCampos();
                    }

                    break;
                case "F5":
                    if (!codigoArticuloValue.Text.Equals(null))
                    {
                        Ventana_SubArticulos();
                    }
                    else
                    {
                        MessageBox.Show("Debe Ingresar un codigo de articulo, para buscar los sub articulos de la misma", "Buscar Sub Articulo", MessageBoxButton.OK, MessageBoxImage.Question);
                        Limpiar_y_DesactivarCampos();
                    }
                    break;
                default:
                    break;
            }
        }

        private void descripcionValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "RETURN":
                    precioUnitarioValue.Focus();
                    break;
                default:
                    break;
            }
        }

        private void precioUnitarioValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    ivaValue.IsEnabled = true;
                    ivaValue.Focus();
                    break;
                default:
                    break;
            }
        }

        private void ivaValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    LlenarCampoPrecioTotal();
                    break;
                default:
                    break;
            }
        }

        private void precioTotalValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "RETURN":

                    if (nuevoItem)
                    {
                        bultoValue.Focus();
                        AgregarItemRemito();
                        nuevoItem = false;
                    }
                    else
                    {
                        ActualizarItem();
                    }

                    Limpiar_y_DesactivarCampos();
                    ActualizarCampoSubTotal();
                    ActualizarCampoImporte();

                    textoInformativoPrecioTotal.Visibility = Visibility.Hidden;

                    break;
                default:
                    return;
            }
        }

        private void precioTotalValue_GotFocus(object sender, RoutedEventArgs e)
        {
            textoInformativoPrecioTotal.Visibility = Visibility.Visible;
        }

        private void precioTotalValue_LostFocus(object sender, RoutedEventArgs e)
        {
            textoInformativoPrecioTotal.Visibility = Visibility.Hidden;
        }

        #endregion

        #region Pie

        private void subTotalValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    ActualizarCampoSubTotal();
                    ActualizarCampoImporte();
                    break;
                case "RETURN":
                    ActualizarCampoSubTotal();
                    ActualizarCampoImporte();
                    break;
                default:
                    break;
            }
        }

        private void bonificacionValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    ActualizarCampoSubTotal();
                    ActualizarCampoImporte();
                    break;
                case "RETURN":
                    ActualizarCampoSubTotal();
                    ActualizarCampoImporte();
                    break;
                default:
                    break;
            }
        }

        #endregion

        #endregion

        #region Metodos de Mouse

        private void dgArticulosRemitos_DoubleClick(object sender, MouseButtonEventArgs e)
        {
            CargarCamposDeItemRemito();
        }

        #endregion

        #endregion

        /***************************************************************************/

        #region Auxiliar Methods

        #region CRUD VerModificarRemito

        private void CargarRemito()
        {
            this.nroRemitoValue.Text = _remito.NroComprobante1.ToString("D4") + "-" + _remito.NroComprobante2.ToString("D8");
            this.codigoClienteValue.Text = _remito.Cliente.Codigo.ToString();
            this.razonSocialClienteTextBox.Text = _remito.Cliente.RazonSocial;
            LlenarCondicionDePago();
            this.condicionDePagoComboBox.SelectedIndex = _remito.Cliente.NroCondicionDePago - 1;

            dgArticulosRemitos.ItemsSource = _remito.Items;

            double subTotal = Convert.ToDouble(_remito.Pie.SubTotal);
            double bonificacion = _remito.Pie.Bonificacion;

            this.importeTotalValue.Text = (subTotal + (subTotal * (bonificacion / 100))).ToString();
            _remito.Pie.Total = Convert.ToDecimal(importeTotalValue.Text);

        }

        private bool ValidarRemito()
        {
            return _remito.Cliente.IsValid()
                && _remito.Pie.IsValid();
        }

        private void GuardarElemento()
        {

            if (this.codigoClienteValue.Text.Equals(null) || this.codigoClienteValue.Text.Equals("0"))
            {

                MessageBox.Show("Debe agregar un CODIGO de CLIENTE antes de guardar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
                return;
            }

            if (this.razonSocialClienteTextBox.Text.Equals(null) || this.razonSocialClienteTextBox.Text.Equals(""))
            {
                MessageBox.Show("Debe agregar una RAZON SOCIAL de CLIENTE antes de guardar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
                return;
            }

            List<ItemRemito> items = _remito.Items;
            if (items.Count <= 0)
            {
                MessageBox.Show("Debe agregar items antes de guardar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
                return;
            }

            Regex regExBulto;
            regExBulto = new Regex(@"[0-9]{1,9}(\.[0-9]{0})?$");
            if (!regExBulto.IsMatch(bultoValue.Text))
            {
                MessageBox.Show("El campo Bulto, posee errores", "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
                return;
            }

            Regex regExPesoKg;
            regExPesoKg = new Regex(@"[0-9]{1,9}(\.[0-9]{0,2})?$");
            if (!regExPesoKg.IsMatch(pesoKilogramoValue.Text))
            {
                MessageBox.Show("El campo Peso en Kg, posee errores", "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
                return;
            }
            //if (pesoKilogramoValue.Text == "0" || pesoKilogramoValue.Text.Equals(null) || pesoKilogramoValue.Text.Equals(""))
            //{
            //    MessageBox.Show("El campo Peso en Kg, posee errores", "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);
            //    return;
            //}

            MessageBoxResult resultadoMensaje = MessageBox.Show("Desea Guardar las modificaciones del Remito " + _remito.Comprobante + " ?", "Guardar Remito ", MessageBoxButton.YesNoCancel, MessageBoxImage.Information);

            switch (resultadoMensaje.ToString())
            {
                case "Yes":
                    _remito.Fecha = Convert.ToDateTime(fechaValue.Text);

                    _remito.Cabecera.NroCliente = Convert.ToInt16(codigoClienteValue.Text);

                    if (itemsEliminados.Count > 0)
                    {
                        itemsDB.EliminarItems(itemsEliminados);
                    }

                    _remito.Pie.Bulto = Convert.ToInt16(bultoValue.Text);
                    _remito.Pie.PesoKilogramo = Convert.ToDouble(pesoKilogramoValue.Text);
                    _remito.Pie.SubTotal = ExtraerSubTotalParaPieRemito(_remito.Items);
                    _remito.Pie.Viajante = viajanteValue.Text.ToUpper();
                    _remito.Pie.Transporte = transporteValue.Text.ToUpper();

                    bool resultadoRemito = Convert.ToBoolean(remitoDB.UpdateRemito(_remito));
                    bool resultadoCabecera = Convert.ToBoolean(cabeceraDB.UpdateCabeceraRemito(_remito.Cabecera));
                    bool resultadoItems = Convert.ToBoolean(itemsDB.UpdateItemsRemito(_remito.Items));
                    bool resultadoPie = Convert.ToBoolean(pieDB.UpdatePieRemito(_remito.Pie));

                    if (resultadoRemito && resultadoCabecera && resultadoItems && resultadoPie)
                        MessageBox.Show("OK");

                    break;
                default:
                    return;
            }

            this.Close();
        }

        #endregion

        /************************Cabecera***************************************/

        #region Cabecera

        private void LlenarEncabezadoSegunCodigoCliente()
        {
            if (!this.codigoClienteValue.Text.Equals(""))
            {
                ClienteCS cliente = new ClienteCS();
                int codigoCliente = Convert.ToInt16(this.codigoClienteValue.Text.ToString());
                cliente = clienteDB.ObtenerClientePorCodigo(codigoCliente);
                if (!cliente.Codigo.Equals(-1))
                {
                    this.razonSocialClienteTextBox.Text = cliente.RazonSocial;
                    _remito.Cliente = cliente;
                    LlenarCondicionDePago();
                    condicionDePagoComboBox.SelectedIndex = cliente.NroCondicionDePago - 1;
                    cantValue.Focus();
                }
                else
                {
                    MessageBox.Show("Seleccione un codigo correcto de Cliente, \n" +
                    "el siguiente no es valido: " + codigoCliente, "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);

                    LimpiarEncabezado();
                }
            }
        }

        private void LlenarEncabezadoSegunRazonSocialCliente()
        {
            if (!this.razonSocialClienteTextBox.Text.Equals(""))
            {
                List<ClienteCS> listaCliente = new List<ClienteCS>();
                ClienteCS cliente = new ClienteCS();

                string razonSocialCliente = "%" + this.razonSocialClienteTextBox.Text.ToUpper() + "%";
                listaCliente = clienteDB.filtrarClientesPorRS(razonSocialCliente);

                if (listaCliente.Count > 0)
                {
                    cliente = listaCliente[0];

                    this.codigoClienteValue.Text = cliente.Codigo.ToString();
                    LlenarCondicionDePago();
                    condicionDePagoComboBox.SelectedIndex = cliente.NroCondicionDePago - 1;
                    cantValue.Focus();
                }
                else
                {
                    MessageBox.Show("Seleccione un nombre correcto de Cliente, \n" +
                    "el siguiente no es valido: " + razonSocialCliente.Replace("%", "").Trim(), "Atencion", MessageBoxButton.OK, MessageBoxImage.Question);

                    LimpiarEncabezado();
                }
            }
        }

        private void LlenarCondicionDePago()
        {
            condicionDePagoComboBox.IsEnabled = true;

            List<CondicionDePagoCS> condicionDePago = new List<CondicionDePagoCS>();
            condicionDePago = condicionDePagoDB.obtenerCondicionDePago();
            condicionDePagoComboBox.ItemsSource = condicionDePago;
        }

        #endregion

        /*=====================Codigos de Articulos===============================*/

        #region Codigos de Articulos

        private void Ventana_Categorias()
        {
            MostrarCategoria categorias = new MostrarCategoria(1);

            categorias.enviarCategoria = new MostrarCategoria.EnviarCategoria(PassDataCategoria);

            categorias.Show();
        }

        private void Ventana_Articulos()
        {
            int codigoCategoria = Convert.ToInt16(codigoCategoriaValue.Text);
            MostrarArticulo articulos = new MostrarArticulo(codigoCategoria);

            articulos.enviarArticulo = new MostrarArticulo.EnviarArticulo(PassDataArticulo);

            articulos.Show();
        }

        private void Ventana_SubArticulos()
        {
            int codigoArticulo = Convert.ToInt16(codigoArticuloValue.Text);
            int codigoCategoria = Convert.ToInt16(codigoCategoriaValue.Text);
            MostrarSubArticulos subArticulos = new MostrarSubArticulos(codigoArticulo, codigoCategoria);

            subArticulos.enviarSubArticulo = new MostrarSubArticulos.EnviarSubArticulo(PassDataSubArticulo);

            subArticulos.Show();
        }

        private void PassDataCategoria(CategoriaArticulo sender)
        {
            codigoCategoriaValue.Text = sender.Codigo.ToString();
        }

        private void PassDataArticulo(Articulo sender)
        {
            codigoArticuloValue.Text = sender.Codigo.ToString();
        }

        private void PassDataSubArticulo(SubArticulo sender)
        {
            codigoSubArticuloValue.Text = sender.Codigo.ToString();
        }

        #endregion

        /*==============================Items=====================================*/

        #region Items

        private void CargarCamposDeItemRemito()
        {
            itemSeleccionado = (ItemRemito)dgArticulosRemitos.SelectedItem;
            indexItemSeleccionado = dgArticulosRemitos.Items.IndexOf(itemSeleccionado);

            if (!itemSeleccionado.Equals(null) && indexItemSeleccionado > -1)
            {
                this.cantValue.Text = itemSeleccionado.Cantidad.ToString();
                this.cantValue.IsEnabled = true;

                this.codigoCategoriaValue.Text = itemSeleccionado.CodigoCategoriaArticulo.ToString();
                this.codigoCategoriaValue.IsEnabled = true;

                this.codigoArticuloValue.Text = itemSeleccionado.CodigoArticulo.ToString();
                this.codigoArticuloValue.IsEnabled = true;

                this.codigoSubArticuloValue.Text = itemSeleccionado.CodigoSubArticulo.ToString();
                this.codigoSubArticuloValue.IsEnabled = true;

                this.descripcionValue.Text = itemSeleccionado.Descripcion;
                this.descripcionValue.IsEnabled = true;

                this.precioUnitarioValue.Text = itemSeleccionado.PrecioUnitario.ToString();
                this.precioUnitarioValue.IsEnabled = true;

                this.ivaValue.Text = itemSeleccionado.Iva.ToString();
                this.ivaValue.IsEnabled = true;

                this.precioTotalValue.Text = itemSeleccionado.PrecioTotal.ToString();
                this.precioTotalValue.IsEnabled = true;
            }
        }

        private void LlenarCampoPrecioTotal()
        {
            int cantidad = Convert.ToInt16(cantValue.Text);
            double precioUnitario = Convert.ToDouble(precioUnitarioValue.Text);
            double iva = Convert.ToDouble(ivaValue.Text);
            precioTotalValue.Text = (cantidad * (precioUnitario + (precioUnitario * (iva / 100)))).ToString();
        }

        private void ActualizarItem()
        {
            ItemRemito aux = _remito.Items[indexItemSeleccionado];

            aux.Cantidad = Convert.ToDouble(this.cantValue.Text);

            aux.CodigoCategoriaArticulo = Convert.ToInt16(this.codigoCategoriaValue.Text);
            aux.CodigoArticulo = Convert.ToInt16(this.codigoArticuloValue.Text);
            aux.CodigoSubArticulo = Convert.ToInt16(this.codigoSubArticuloValue.Text);

            aux.CodigoUniArticulo = aux.CodigoCategoriaArticulo + " - " + aux.CodigoArticulo + " - " + aux.CodigoSubArticulo;

            aux.Descripcion = this.descripcionValue.Text;
            aux.PrecioUnitario = Convert.ToDecimal(this.precioUnitarioValue.Text);
            aux.Iva = Convert.ToDouble(this.ivaValue.Text);
            aux.PrecioTotal = Convert.ToDouble(this.precioTotalValue.Text);

            _remito.Items.RemoveAt(indexItemSeleccionado);
            _remito.Items.Insert(indexItemSeleccionado, aux);

            _remito.Pie.SubTotal = ExtraerSubTotalParaPieRemito(_remito.Items);

            dgArticulosRemitos.ItemsSource = _remito.Items;
            dgArticulosRemitos.Items.Refresh();
        }

        private void AgregarItemRemito()
        {
            ItemRemito itemRemito = new ItemRemito();

            itemRemito.CodigoEmpresa = _remito.CodigoEmpresa;
            itemRemito.NroComprobante1 = _remito.NroComprobante1;
            itemRemito.NroComprobante2 = _remito.NroComprobante2;
            itemRemito.CodigoTipo = 1;

            itemRemito.Posicion = _remito.Items.Count + 1;

            itemRemito.CodigoCategoriaArticulo = Convert.ToInt16(codigoCategoriaValue.Text);
            itemRemito.CodigoArticulo = Convert.ToInt16(codigoArticuloValue.Text);

            itemRemito.CodigoSubArticulo = Convert.ToInt16(codigoSubArticuloValue.Text);

            itemRemito.CodigoUniArticulo = itemRemito.CodigoCategoriaArticulo + " - " + itemRemito.CodigoArticulo + " - " + itemRemito.CodigoSubArticulo;

            itemRemito.Cantidad = Convert.ToInt16(cantValue.Text);
            itemRemito.PrecioUnitario = Convert.ToDecimal(precioUnitarioValue.Text);

            itemRemito.Iva = Convert.ToDouble(ivaValue.Text);
            itemRemito.Descripcion = descripcionValue.Text;

            double precioUnitario = Convert.ToDouble(precioUnitarioValue.Text);
            double iva = Convert.ToDouble(ivaValue.Text);
            itemRemito.PrecioTotal = Convert.ToDouble(itemRemito.Cantidad * (precioUnitario + (precioUnitario * (iva / 100))));

            _remito.Items.Add(itemRemito);

            _remito.Pie.SubTotal = ExtraerSubTotalParaPieRemito(_remito.Items);

            dgArticulosRemitos.ItemsSource = _remito.Items;

            dgArticulosRemitos.Items.Refresh();
        }

        private void EliminarItem()
        {

            int indexItemSeleccionadoEliminar = -1;
            ItemRemito itemSeleccionadoEliminar = null;

            MessageBoxResult resultadoMensaje;

            itemSeleccionadoEliminar = (ItemRemito)dgArticulosRemitos.SelectedItem;
            indexItemSeleccionadoEliminar = dgArticulosRemitos.Items.IndexOf(itemSeleccionadoEliminar);

            if (!itemSeleccionadoEliminar.Equals(null) && indexItemSeleccionadoEliminar > -1)
            {
                string descripcionItem = itemSeleccionadoEliminar.Descripcion;

                resultadoMensaje = MessageBox.Show("Desea eliminar el item " + descripcionItem, "Eliminar Item", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);


                switch (resultadoMensaje.ToString())
                {
                    case "Yes":

                        itemsEliminados.Add(itemSeleccionadoEliminar);

                        MessageBox.Show("Item " + itemSeleccionadoEliminar.Descripcion + " ELIMINADO", "EliminarItem");

                        _remito.Items.RemoveAt(indexItemSeleccionadoEliminar);

                        dgArticulosRemitos.ItemsSource = _remito.Items;
                        dgArticulosRemitos.Items.Refresh();

                        break;
                    default:
                        return;
                }

            }
        }

        #endregion

        /*=====================Limpiar======================================*/

        #region Limpiar

        private void Limpiar_y_DesactivarCampos()
        {
            cantValue.Text = "";
            cantValue.IsEnabled = false;

            codigoCategoriaValue.Text = "";
            codigoCategoriaValue.IsEnabled = false;

            codigoArticuloValue.Text = "";
            codigoArticuloValue.IsEnabled = false;

            codigoSubArticuloValue.Text = "";
            codigoSubArticuloValue.IsEnabled = false;

            descripcionValue.Text = "";
            descripcionValue.IsEnabled = false;

            precioUnitarioValue.Text = "";
            precioUnitarioValue.IsEnabled = false;

            ivaValue.Text = "";
            ivaValue.IsEnabled = false;

            precioTotalValue.Text = "";
            precioTotalValue.IsEnabled = false;
        }

        private void LimpiarEncabezado()
        {
            codigoClienteValue.Focus();
            codigoClienteValue.Text = "";

            razonSocialClienteTextBox.Text = "";

            condicionDePagoComboBox.ItemsSource = null;
            condicionDePagoComboBox.IsEnabled = false;
        }

        #endregion

        /*=====================Pie===========================================*/

        #region Pie

        private void ActualizarCampoSubTotal()
        {
            double resultado = 0;

            foreach (ItemRemito item in _remito.Items)
            {
                resultado = resultado + item.PrecioTotal;
            }

            subTotalValue.Text = resultado.ToString();
            _remito.Pie.SubTotal = Convert.ToDecimal(resultado);
        }

        private void ActualizarCampoImporte()
        {
            double resultado = 0;

            foreach (ItemRemito item in _remito.Items)
            {
                resultado = resultado + item.PrecioTotal;
            }

            double bonificacion = Convert.ToDouble(bonificacionValue.Text);

            resultado = resultado + (resultado * (bonificacion / 100));

            importeTotalValue.Text = resultado.ToString("C", new System.Globalization.CultureInfo("en-US"));
            _remito.Pie.Total = Convert.ToDecimal(resultado);
            _remito.Pie.Bonificacion = bonificacion;
        }

        private decimal ExtraerSubTotalParaPieRemito(List<ItemRemito> itemsRemito)
        {
            decimal resultado = 0;

            if (itemsRemito.Count > 0)
            {
                foreach (ItemRemito item in itemsRemito)
                {
                    resultado = resultado + Convert.ToDecimal(item.PrecioTotal);
                }
            }

            return resultado;
        }

        #endregion

        #endregion
    }
}
